package com.xxx.springboot.distributedsession;

import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.StringUtils;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * cookie 工具类
 */
@Log4j2
public class CookieUtil {

	/**
	 * 根据name获取对象的cookie对象
	 *
	 * @param request
	 *            请求
	 * @param name
	 *            cookie名称
	 * @return 如果有相应名称的Cookie，则返回相应Cookie实例。没有返回null。
	 */
	public static Cookie findCookie(HttpServletRequest request, String name) {
		if (null != request) {
			Cookie[] cookies = request.getCookies();
			if (null != cookies && cookies.length > 0) {
				for (Cookie cookie : cookies) {
					if (cookie.getName().equals(name)) {
						return cookie;
					}
				}
			}
		}
		return null;
	}

	/**
	 * 增加一个Cookie.ContextPath如果为空或者长度为0，将使用"/".
	 *
	 * @param request
	 *            当前请求。
	 * @param response
	 *            当前响应。
	 * @param name
	 *            cookie名称
	 * @param value
	 *            cookie值
	 * @param domain
	 *            cookie域名
	 * @param contextPath
	 *            cookie路径
	 * @param maxAge
	 *            有效时间
	 */
	public static void addCookie(HttpServletRequest request, HttpServletResponse response, String name, String value,
			String domain, String contextPath, int maxAge) {

		if (request != null && response != null) {
			Cookie cookie = new Cookie(name, value);
			cookie.setMaxAge(maxAge);
			cookie.setSecure(request.isSecure());

			if (StringUtils.isEmpty(contextPath)) {
				cookie.setPath("/");
			} else {
				cookie.setPath(contextPath);
			}

			if (StringUtils.isNotEmpty(domain)) {
				cookie.setDomain(domain);
			}

			response.addCookie(cookie);

			log.debug("addCookie[name={},value={},maxAge={},secure={},path={},domain={}]", cookie.getName(),
					cookie.getValue(), String.valueOf(cookie.getMaxAge()), String.valueOf(cookie.getSecure()),
					cookie.getPath(), cookie.getDomain());
		}
	}

	/**
	 * 失效一个Cookie.
	 *
	 * @param request
	 *            当前请求。
	 * @param response
	 *            当前响应。
	 * @param name
	 *            Cookie名称。
	 * @param domain
	 *            Cookie域名。
	 * @param contextPath
	 *            有效路径。
	 */
	public static void invalidCookie(HttpServletRequest request, HttpServletResponse response, String name,
			String domain, String contextPath) {
		if (request != null && response != null) {
			addCookie(request, response, name, null, domain, contextPath, 0);
		}
	}

}
